package aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TransactionAspect {
    private static final Logger log = LoggerFactory.getLogger(TransactionAspect.class);

    /**
     * 前置增强-打来数据库连接开启事务
     */
    //@Before(value="execution(* service..*.*(..))")

    @Before(value = "pt()")
    public void before(JoinPoint jp)
    {
        log.info("【TransactionAspect前置增强】模拟打开数据库连接开启事务。。。");
        log.info("SqlSession = MyBatisUtil.createSqlSession(false)");
    }
    /**
     * 后置增强-执行事务提交
     */
    @AfterReturning(value = "execution(* service..*.*(..))",returning = "result")
    public void afterReturning(JoinPoint jp,Object result)
    {
        log.info("【TransactionAspect后置增强】模拟正常完成业务提交事务。。。");
        log.info("SqlSession.commit()");
    }
    /**
     * 异常抛出增强-执行事务回滚
     */
    @AfterThrowing(value = "execution(* service..*.*(..))",throwing = "e")
    public void afterThrowing(JoinPoint jp,Throwable e)
    {
        log.info("【TransactionAspect异常抛出增强】模拟业务异常回滚事务，异常信息为："+e.getMessage());
        log.info("session.rollback");
    }
    /**
     * 最终增强-执行关闭数据库资源
     */
    //@After(value="execution(* service..*.*(..))")
    @After(value = "pt()")
    public void after(JoinPoint jp){
        log.info("【TransactionAspect最终增强】模拟业务完成释放资源.");
        log.info("MyBatisUtil.closeSqlssion(sqlSession);");
    }


    //定义切入点，方法名则为引用名称
    @Pointcut("execution(* service..*.*(..))")
    public void pt(){}

    //@Before(value = "pt()")
//    public void before(JoinPoint jp){
//        log.info("【TransactionAspect前置增强】模拟打开数据库连接开启事务。。。");
//        log.info("SqlSession = MyBatisUtil.createSqlSession(false)");
//    }

//    @AfterThrowing(value = "pt()",throwing = "e") n
//    public void afterThrowing(JoinPoint jp,Throwable e){
//        log.info("【TransactionAspect异常抛出增强】模拟业务异常回滚事务，异常信息为："+e.getMessage());
//        log.info("session.rollback");
//    }

//    public void after(JoinPoint jp){
//        log.info("【TransactionAspect最终增强】模拟业务完成释放资源.");
//        log.info("MyBatisUtil.closeSqlssion(sqlSession);");
//    }
}
